<?php

namespace App\Models;

use Database\Factories\MechanicFactory;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Eloquent;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;

/**
 * App\Models\Mechanic
 *
 * @property int $id
 * @property string $name 机械名称
 * @property Carbon|null $created_at
 * @property Carbon|null $updated_at
 * @property-read Owner|null $carOwner
 * @property-read Collection|Owner[] $carOwners
 * @property-read int|null $car_owners_count
 * @method static MechanicFactory factory(...$parameters)
 * @method static Builder|Mechanic newModelQuery()
 * @method static Builder|Mechanic newQuery()
 * @method static Builder|Mechanic query()
 * @method static Builder|Mechanic whereCreatedAt($value)
 * @method static Builder|Mechanic whereId($value)
 * @method static Builder|Mechanic whereName($value)
 * @method static Builder|Mechanic whereUpdatedAt($value)
 * @mixin Eloquent
 */
class Mechanic extends Model
{
    use HasFactory, HasDateTimeFormatter;

    /**
     *  获取汽车的主人（远程一对一）
     */
    public function carOwner()
    {
        // 最简单的表达方式
        // return $this->hasOneThrough(Owner::class, Car::class);

        // 最终表达方式
        return $this->hasOneThrough(
            Owner::class,       // 第一个参数：子表数据模型
            Car::class,         // 第二个参数：中间表数据模型
            'mechanic_id',      // 第三个参数：中间表外键名
            'car_id',           // 第四个参数：子表外键名
            'id',               // 第五个参数：父表本地键名
            'id',               // 第六个参数：中间表本地键名
        );
    }


    /**
     *  获取汽车的主人 （远程一对多）
     */
    public function carOwners()
    {
        // 最简单的表达方式
        // return $this->hasManyThrough(Owner::class, Car::class);

        // 最终表达方式
        return $this->hasManyThrough(
            Owner::class,       // 第一个参数：子表数据模型
            Car::class,         // 第二个参数：中间表数据模型
            'mechanic_id',      // 第三个参数：中间表外键名
            'car_id',           // 第四个参数：子表外键名
            'id',               // 第五个参数：父表本地键名
            'id',               // 第六个参数：中间表本地键名
        );
    }
}
